package com.qut.graduate.busrtquery.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.widget.Toast;

import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.qut.graduate.busrtquery.interfaces.LocationChangeCallBack;

public class MyLocationService extends Service {

    // 定位是耗时操作，Service里面不能做耗时操作，所以用Handler来接收
    public static Handler handler;
    private MyBind myBind = new MyBind();
    // 客户端定位
    private LocationClient client;
    private MyLocationLitener myLocationLitener;

    private LocationChangeCallBack mLocationChangeCallBack = null;

    public void setmLocationChangeCallBack(LocationChangeCallBack locationChangeCallBack) {
        this.mLocationChangeCallBack = locationChangeCallBack;
    }

    @Override
    public void onCreate() {
        super.onCreate();

    }

    // 得到用户的具体位置
    private void getLocation() {
        client = new LocationClient(getApplicationContext());
        myLocationLitener = new MyLocationLitener();
        client.registerLocationListener(myLocationLitener); // 给客户端注册监听
        LocationClientOption mOption = new LocationClientOption(); // 新建一个客户端位置选项
        mOption.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); // 可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        mOption.setCoorType("bd09ll"); // 可选，默认gcj02，设置返回的定位结果坐标系，如果配合百度地图使用，建议设置为bd09ll;
        mOption.setScanSpan(5000); // 可选，默认0，即仅定位一次，设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        mOption.setIsNeedAddress(true); // 可选，设置是否需要地址信息，默认不需要
        mOption.setIsNeedLocationDescribe(true); // 可选 ，设置是否需要地址描述
        mOption.setNeedDeviceDirect(false); // 可选，设置是否需要设备方向结果
        mOption.setLocationNotify(false); // 可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        mOption.setIgnoreKillProcess(true); // 可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        mOption.setIsNeedLocationDescribe(true); // 可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        mOption.setIsNeedLocationPoiList(true); // 可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        mOption.SetIgnoreCacheException(false); // 可选，默认false，设置是否收集CRASH信息，默认收集
        mOption.setOpenGps(true); // 可选，默认false，设置是否开启Gps定位
        mOption.setIsNeedAltitude(false); // 可选，默认false，设置定位时是否需要海拔信息，默认不需要，除基础定位版本都可用
        client.setLocOption(mOption); // 客户端得到这个选项
        client.start(); // 打开客户端
    }

    // 此方法是为了监听用户操作
    private class MyLocationLitener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            if (bdLocation == null) {
                Toast.makeText(getApplicationContext(), "网络问题,定位失败!", Toast.LENGTH_SHORT).show();
                return;
            } else {
                mLocationChangeCallBack.onLocationChange(bdLocation);
                //Log.d("onReceiveLocation: ",  bdLocation.getAddrStr());
            }
        }
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        getLocation(); // 调用方法
        return myBind;
    }


    // 新建一个内部类，继承自Binder目的是为了让Activity能够绑定Service里面的信息
    public class MyBind extends Binder {
        // 继承Binder所要实现的方法
        public MyLocationService getMyLocationService() {
            return MyLocationService.this;
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (myLocationLitener!=null){
            client.unRegisterLocationListener(myLocationLitener);
        }
        if(client != null && client.isStarted()){
            client.stop();
        }
    }

}
